#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2024/8/23 23:17
# @Author  : Yuyun
# @File    : leetcode_84_柱状图中最大的矩形.py
# @IDE     : PyCharm


"""
给定 n 个非负整数，用来表示柱状图中各个柱子的高度。每个柱子彼此相邻，且宽度为 1 。
求在该柱状图中，能够勾勒出来的矩形的最大面积。

示例 1:
输入：heights = [2,1,5,6,2,3]
输出：10
解释：最大的矩形为图中红色区域，面积为 10
示例 2：
输入： heights = [2,4]
输出： 4
提示：
1 <= heights.length <=105
0 <= heights[i] <= 104
"""

class Solution:

    #   单调栈、从左到右按行计算
    # def max_rectangle_I(self, height):
    #     #   存储下标
    #     stack = []
    #     length = len(height)
    #     #   存储结果
    #     result = 0
    #     for i in range(length):
    #         #   栈不空，且 当前高度 > 栈顶高度
    #         while stack and height[i] > height[stack[-1]]:
    #             #   取凹槽底部
    #             mid = height[stack.pop()]
    #             #   若弹出栈顶（前面元素最大高度）后，栈为空，表示此处无法储水
    #             if stack:
    #                 # 雨水高度是 min(凹槽左侧高度, 凹槽右侧高度) - 凹槽底部高度
    #                 height_diff = min(height[stack[-1], height[i]]) - mid
    #                 width = i - stack[-1] - 1
    #                 result += height_diff * width
    #         #   栈空，或者，高度小于栈顶高度
    #         stack.append(i)
    #     return result

    #   双指针法，从左到右按列计算
    def max_rectangle_I(self, height):

        length = len(height)
        #   从左到右存储该位置处的左侧最低
        leftMin = [0] * length
        leftMin[0] = -1
        for i in range(1, length):
            # 以当前柱子为主心骨，向左迭代寻找次级柱子
            tmp = i - 1
            while tmp >= 0 and height[tmp] >= height[i]:
                # 当左侧的柱子持续较高时，尝试这个高柱子自己的次级柱子
                tmp = leftMin[tmp]
            # 当找到左侧矮一级的目标柱子时
            leftMin[i] = tmp
        #   从右到左存储该位置处的右侧最高
        rightMin = [0] * length
        rightMin[-1] = length
        for j in range(length - 2, -1, -1):
            # 以当前柱子为主心骨，向右迭代寻找次级柱子
            tmp = j + 1
            while tmp < length and height[tmp] >= height[j]:
                # 当右侧的柱子持续较高时，尝试这个高柱子自己的次级柱子
                tmp = rightMin[tmp]
            # 当找到右侧矮一级的目标柱子时
            rightMin[j] = tmp

        result = 0
        for k in range(length):
            area = height[k] * (rightMin[k] - leftMin[k] - 1)
            result = max(area, result)
        return result


if __name__ == '__main__':
    height = list(map(int, input().split()))
    solution = Solution()
    result = solution.rain(height)
    print(result)

